Simhash相似哈希算法

前言

最近在阅读吴军博士的<<数学之美>>这门书,得到了很多的启发和思考,里面提到了一个概念---信息指纹。一般正常人提到这个概念,第一个想到的词应该是哈希映射算法,将任何对象都映射成一个独立的变量,一般这个变量是一个独有的数字,当然也不排除哈希碰撞的可能行。论单个对象,用哈希算法做一次映射,比较对象是否一致,这固然是可以的,但是如果想用哈希算法做一些文章之间的相似度计算的时候,可能传统的哈希算法就不见得是最佳的选择了,如果把整篇文章都作为一个超长字符串的去计算,准确率无法保证,因为字符串中的任何字符的变化,也许都会造成后面的值变得差异很大。那么如果单个单个去计算的话,如何用一个有效的标准去衡量这些看似没有关联的哈希值呢。还好我们是站在巨人的肩膀上的,有一种叫Simhash算法正好巧妙的解决了我们的问题。

Simhash的背景

Simhash当初比较早些的时候用在了Google的网页爬虫中,用于重复网页的去重。可以说,Simhash就是拿来计算网页的信息指纹。Simhash是在2002年的时候由Moses Chariker 提出的。

Simhash算法原理

Simhash的设计非常的巧妙,这里举一个实际的使用场景,来使大家直观的感受这个神奇的算法。比如比较2个网页的相似度,那么比较的关键就是里面的各种词,假设有t1,t2.t3等等,每个词都会自己的信息指纹,最简单的就是字符串的hashcode值,而Simhash的作用就是把这些值进行一个汇总,得到一个整个网页的哈希值。下面是2个大的模块。

一.扩展。将上个步骤中的各个词的哈希值取余数,做一个位数的限制,比如最终的展现需要为8位的二进制数,就要把哈希值取2的8次方就是256的余数,方便后面的加减权重操作。然后初始化一个8位数组,默认每个位上的值都为0。下面的步骤是第一个模块的关键步骤了。

因为刚刚有t1,t2,t3等等这些词语的哈希值,然后取余数后就是1个个的8位的二进制整数,下面是遍历操作,取第一个词的信息指纹,假设是10000010,(随便假设的),此时总的哈希值为:

r1=1   0+w1

r2=0   0-w1

r3=0  0-w1<

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值